package ch.penas.business.service;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import junit.framework.Assert;
import ch.penas.business.dom.Ouvrage;
import ch.penas.business.dom.RechercheOuvrage;

/** @author Daniel */
public class OuvrageServiceImpl extends OuvrageAbstractMYSQL implements OuvrageService, Serializable {

    /** Serialisation de la class pour une question de securiter. */
    private static final long serialVersionUID = -2110612069928443073L;

    /** Le nom de la liste ou ce trouve les ouvrages. */
    private List<Ouvrage> mOuvrageList;
    
    /** Le nom de la liste ou ce trouve les ouvrages rechercher. */
    private List<Ouvrage> mRechercheOuvrageList;
    
    /** Permet de stocker un ouvrage rechercher le temps de l'ajouter dans la list des ouvrage rechercher. */
    private Ouvrage tempsRechercheOuvrage = new Ouvrage();
    
    private String modifAuteur;
    private String modifGenre;
    private String modifGenrePublic;
    private String modifProvenance;
    private String modifEmprunter;
    private String modifDessinateur;
    private String modifTitre;
    private String modifEditeur;
    private int modifNbPages;
    private String modifParution;
    private String modifDatePret;
    private String modifArendreLe;

	/** Constructeur de la class OuvrageServiceImpl. */
    public OuvrageServiceImpl() {
        this.mOuvrageList = new ArrayList<Ouvrage>();
        this.mRechercheOuvrageList = new ArrayList<Ouvrage>();
    }

    /** Permet de recupere la valeur de la liste ou ce trouve les ouvrages.
     * 
     * @return mOuvrageList
     */
    public final List<Ouvrage> getAll() {
        return this.mOuvrageList;
    }
    
    /** Permet de recupere la valeur de la liste des ouvrage rechercher.
     * 
     * @return mRechercheOuvrageList
     */
    public final List<Ouvrage> getAllRecherche() {
        return this.mRechercheOuvrageList;
    }
    
    /** Permet de retourner un ouvrage rechercher.
     * 
     * @return tempsRechercheOuvrage
     */
    public final Ouvrage getTempsRechercheOuvrage() {
		return this.tempsRechercheOuvrage;
	}

    /** Permet d'ajouter un ouvrage a la list des ouvrage.
     * 
     * @param ouvrage est egale a un objet de la class ouvrage
     */
	public final void add(final Ouvrage ouvrage) {
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();
			
			getEntityTransaction().begin();
			getEntityManager().persist(ouvrage);
			getEntityTransaction().commit();
			
			Assert.assertEquals(n + 1, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
    /** Permet d'ajouter un ouvrage rechercher a la list des ouvrage.
     * 
     * @param rechercheOuvrage est egale a un objet de la class ouvrage
     */
    public final void addRecherche(final Ouvrage rechercheOuvrage) {
		this.mRechercheOuvrageList.add(rechercheOuvrage);
	}
    
    /** Permet de retourner le nombre d'ouvrage enregistrer dans la base de donnée.
     * 
     * @return resultQuery est egale a la list des ouvrage
     */
	public final int getNbOuvrage() {
		Object resultQuery;
		try {
			initFixture();
		} catch (Exception e) {
			e.printStackTrace();
		}
		getEntityTransaction().begin();

		Query query = getEntityManager().createQuery("SELECT COUNT(e.titre) FROM Ouvrage e");
		int n = query.getResultList().size();

		resultQuery = query.getSingleResult();

		getEntityTransaction().commit();
		Assert.assertEquals(n, query.getResultList().size());

		try {
			closeEntityManager();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return Integer.parseInt(resultQuery.toString());
	}
    
    /** Permet de rechercher si oui/non il existe un ouvrage dans la liste.
     * 
     * @param mRechercheOuvrage est egale a la class RechercheOuvrage
     */
	public final void search(final RechercheOuvrage mRechercheOuvrage) {
		if ((mRechercheOuvrage.getSearchCodeIsbn() > 0) && (mRechercheOuvrage.getSearchAuteur() != null) && (mRechercheOuvrage.getSearchGenre() != null) && (mRechercheOuvrage.getSearchTitre() != null)) {
			
			try {
				initFixture();
			} catch (Exception e) {
				e.printStackTrace();
			}
			getEntityTransaction().begin();

			Query query = getEntityManager().createQuery("SELECT e FROM Ouvrage e WHERE e.titre='"+ mRechercheOuvrage.getSearchTitre() + "'", Ouvrage.class);
			int n = query.getResultList().size();

			@SuppressWarnings("unchecked")
			List<Ouvrage> b = query.getResultList();
			for (Ouvrage u : b) {
				System.out.println("La recherche c'est correctement passer. \nTitre trouver: "+ u.getTitre());
				this.tempsRechercheOuvrage = u;
				this.addRecherche(this.getTempsRechercheOuvrage());
			}

			getEntityTransaction().commit();
			Assert.assertEquals(n, query.getResultList().size());

			try {
				closeEntityManager();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("La recherche n'a pas aboutie !! ");
		}

	}
	
	public String getModifTitre() {
		return this.tempsRechercheOuvrage.getTitre();
	}
    
	public final void setModifTitre(final String mRechercheOuvrage) {
		this.modifTitre = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setTitre(this.modifTitre);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setTitre(this.modifTitre);
	}
	
	public String getModifDessinateur() {
		return this.tempsRechercheOuvrage.getDessinateur();
	}
    
	public final void setModifDessinateur(final String mRechercheOuvrage) {
		this.modifDessinateur = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setDessinateur(this.modifDessinateur);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setDessinateur(this.modifDessinateur);
	}
    
	public String getModifAuteur() {
		return this.tempsRechercheOuvrage.getAuteur();
	}
    
	public final void setModifAuteur(final String mRechercheOuvrage) {
		this.modifAuteur = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage auteur = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			auteur.setAuteur(this.modifAuteur);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setAuteur(this.modifAuteur);
	}
	
	public String getModifEditeur() {
		return this.tempsRechercheOuvrage.getEditeur();
	}
    
	public final void setModifEditeur(final String mRechercheOuvrage) {
		this.modifEditeur = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage auteur = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			auteur.setEditeur(this.modifEditeur);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setEditeur(this.modifEditeur);
	}
	
	public int getModifNbPages() {
		return this.tempsRechercheOuvrage.getNbPages();
	}
    
	public final void setModifNbPages(final int mRechercheOuvrage) {
		this.modifNbPages = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage auteur = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			auteur.setNbPages(this.modifNbPages);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setNbPages(this.modifNbPages);
	}
	
	public String getModifGenre() {
		return this.tempsRechercheOuvrage.getGenre();
	}
    
	public final void setModifGenre(final String mRechercheOuvrage) {
		this.modifGenre = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setGenre(this.modifGenre);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setGenre(this.modifGenre);
	}
	
	public String getModifGenrePublic() {
		return this.tempsRechercheOuvrage.getGenrePublic();
	}
    
	public final void setModifGenrePublic(final String mRechercheOuvrage) {
		this.modifGenrePublic = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setGenrePublic(this.modifGenrePublic);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setGenrePublic(this.modifGenrePublic);
	}
	
	public String getModifProvenance() {
		return this.tempsRechercheOuvrage.getProvenance();
	}
    
	public final void setModifProvenance(final String mRechercheOuvrage) {
		this.modifProvenance = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setProvenance(this.modifProvenance);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setProvenance(this.modifProvenance);
	}
	
	public String getModifParution() {
		return this.tempsRechercheOuvrage.getParution();
	}
    
	public final void setModifParution(final String mRechercheOuvrage) {
		this.modifParution = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setParution(this.modifParution);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setParution(this.modifParution);
	}
	
	public String getModifEmprunter() {
		return this.tempsRechercheOuvrage.getEmprunter();
	}
    
	public final void setModifEmprunter(final String mRechercheOuvrage) {
		this.modifEmprunter = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setEmprunter(this.modifEmprunter);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setEmprunter(this.modifEmprunter);
	}
	
	public String getModifDatePret() {
		return this.tempsRechercheOuvrage.getDatePret();
	}
	
	public final void setModifDatePret(final String mRechercheOuvrage) {
		this.modifDatePret = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setDatePret(this.modifDatePret);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setDatePret(this.modifDatePret);
	}
	
	public String getModifArendreLe() {
		return this.tempsRechercheOuvrage.getArendreLe();
	}
	
	public final void setModifArendreLe(final String mRechercheOuvrage) {
		this.modifArendreLe = mRechercheOuvrage;
		
		try {
			initFixture();
			CriteriaBuilder qb = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<Ouvrage> c = qb.createQuery(Ouvrage.class);
			Query query = getEntityManager().createQuery(c);

			int n = query.getResultList().size();

			getEntityTransaction().begin();
			Ouvrage genre = getEntityManager().find(Ouvrage.class, tempsRechercheOuvrage.getCodeIsbn());
			genre.setArendreLe(this.modifArendreLe);
			getEntityTransaction().commit();

			Assert.assertEquals(n, query.getResultList().size());

			closeEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}

		tempsRechercheOuvrage.setArendreLe(this.modifArendreLe);
	}
}